PREPARACIÓN EXAMEN

Teoría

¿Qué es la sobreescritura o redefinición de métodos?

Para introducir la sobreescritura hay que conocer la herencia de clases.

Sabemos que en la herencia, una subclase hereda los atributos y los métodos de la superclase (publicos y protected). Entonces, una subclase sobreescribe un método de la superclase cuando define un método con las mismas características que el método de la superclase.

Las subclases suelen emplear la sobreescritura de métodos para agregar o modificar la funcionalidad del método heredado de la superclase.

Ejemplo:

 

¿Qué es un bloque try-catch-finally?

Todo programa es susceptible de anomalías en su ejecución, pueden ser anomalías controladas y no controladas.

Cuando hablamos anomalías controladas, hablamos de aquellas que el desarrollador es capaz de detectar y tiene la capacidad de poder controlarlas. Sin embargo, las no controladas son errores que suceden y que el desarrollador no es capaz de predecir.

Para asegurarnos de controlar estas anomalías se puede implementar el bloque try-catch-finally, que es un manejador de excepciones que nos permite controlar las posibles anomalías o errores en una sección del código.

El bloque try, indica cuales son son las instrucciones que se quieren controlar y los manejadores que se invocarían si se produjeran anomalías en estas instrucciones.

Los manejadores, bloque catch, deben especificar el tipo de excepción que capturan y van asociados siempre a un bloque try. Deberá haber al menos un manejador por cada tipo de excepción que se pueda lanzar en el bloque try correspondiente.

Cuando se produce una excepción, el código deja de ejecutarse, pero hay situaciones en las que el bloque de código debe ejecutarse, independientemente de si se lanzo o no una excepción. Para que esto suceda, se utiliza la cláusula finally, que se ejecutara siempre, independientemente de si ha habido una excepción o no.

Ejemplo:

 

Explica el problema del interbloqueo en Programación Concurrente

En un entorno de multihilo existen varios hilos que pueden competir por un número finito de recursos (procesadores, memoria, archivos...). Los hilos adquieren recursos y, con ello, la ejecución excluyente para los demás procesos.

Un conjunto de procesos está interbloqueado si cada proceso del conjunto está esperando un suceso que solo otro proceso del conjunto puede producir.

Los interbloqueos se pueden describir de una manera más precisa utilizando un grafo dirigido conocido como grafo de asignación de recursos del sistema. Este grafo consiste, por una parte, de un conjunto de nodos compuestos por los procesos y recursos que hay en el sistema y, por otra, por un conjunto de arcos dirigidos que unen procesos y recursos. Un arco dirigido de un proceso Pi a un recurso Ri indica que Pi está bloqueado esperando que se le conceda el recurso Ri. Si el arco está dirigido de Ri a Pi, significa que el proceso Pi tiene asignado el recurso Ri.

 

Interbloqueo_1

 

La situación de interbloqueo para los procesos A y B puede describirse de la siguiente manera mediante un grafo de asignación:

 

Interbloqueo_2

 

Si no existen recursos compartidos entre procesos. ¿puede haber interbloqueo?

No, debe existir al menos un recurso compartido por los procesos sobre el cual solo puede acceder un proceso simultáneamente.

 

¿Qué es una sección crítica y cómo se implementa en Java?

Es la parte del código que puede generar errores de sincronización si dos o más hilos intentan acceder al mismo tiempo.

Seccion_critica

Cualquier solución al problema de la sección crítica debe satisfacer los tres requisitos:

  1. Exclusión mutua: Sólo un proceso se ejecuta simultaneamente.
  2. Progreso: Cuando ningún proceso ejecuta la sección crítica, algún proceso que lo solicite podrá entrar utilizando un protocolo que impida la entrada simultánea de varios procesos.
  3. Espera limitada: Ningún proceso debe esperar ilimitadamente la entrada en la sección crítica.

Sincronización de Hilos en Java

La sincronización se construye a partir de un concepto denominado cerrojo o monitor.

Funcionamiento: Un hilo quiere ejecutar un código sincronizado, así que, deberá adquirir un cerrojo primero. Cuando el cerrojo esta en posesión de otro hilo, el hilo se pone en espera y se vuelve a activar cuando el cerrojo es liberado.

Protocolo de adquisición y liberación de cerrojos

  1. Un bloqueo se adquiere a la entrada de un método o bloque synchronized y se libera a la salida.
  2. Los cerrojos solo funcionan a nivel de hilos y no en la invocación del método.
  3. Los métodos que no son synchronized no se ven afectados.
  4. Cuando un hilo libera un cerrojo otro hilo puede adquirirlo.

Sección crítica a nivel de metodo:

 

Sección crítica a nivel de bloque de código:

 

¿Para qué sirve la cláusula synchronized en Java?

La cláusula synchronized permite delimitar una sección crítica para que se ejecute un solo hilo en ella.

Funciona a dos niveles de alcance:

A nivel de metodo:

 

A nivel de bloque de código:

 

¿Qué es un Patrón de diseño?

Un patrón de diseño es una solución a un problema que se ha presentado en múltiples ocasiones y nos sirve de base para buscar soluciones a problemas de desarrollo similares.

El patrón de diseño documenta una solución probada y aceptada al problema en cuestión.

 

¿Qué partes tiene la definición de un Patrón de diseño?

 

Para que algo sea considerado como patrón de diseño ¿qué requisitos tiene que cumplir?

Debe ser efectivo, de modo que se haya podido comprobar su éxito resolviendo problemas anteriores; y debe ser reutilizable, es decir, podemos aplicarlo a problemas que se hallan en circunstancias similares a las descritas por el patrón.

 

Práctica

Dado el siguiente modelo de clases en UML

Cola_mensajes

  1. Defina las siguientes excepciones en Java: PrioridadNoValida (la prioridad del mensaje no está en rango 1-5), ColaMensajesVacia (si tamaño=0) y ColaMensajesLlena (si tamaño=MAX_LIM).

    Estas son las clases que definen nuestras excepciones:

     

  2. Implemente el modelo de clases anterior en Java e incorpore el tratamiento de errores considerando las anteriores excepciones. Implementar el tratamiento en el mismo nivel donde se producen las excepciones.

    Tratamiento en el mismo nivel:

     

    Tratamiento elevando la excepción:

     

Dado el siguiente modelo de clases UML

Gestor_energia

  1. Implemente el modelo de clases en Java con sus constructores y métodos correspondientes.

    Para la clase GestorCosteEnergia considerere lo siguiente:

    • Método calcularCosteEnergetico ( ): devuelve el coste de la energía consumida por los aparatos eléctricos. El coste de cada aparato se calcula de la siguiente forma:

      Coste (aparato) = potencia * horasActivo * preciokWh

    • Método calcularAparatoMayorCoste( ): devuelve el AparatoElectrico que mayor coste tiene.

     

  2. Implemente una clase denominada TestGestorEnergia que instancie objetos del modelo y pruebe su funcionalidad. Para ello considere la siguiente tabla de valores de ejemplo de aparatos eléctricos y compañía eléctrica.

    Tabla de ejemplos de consumo y horas de actividad.

    AparatoPotencia kWhhoras activo / mes
    Vitrocerámica1,460
    Lavadora0,3330
    Frigorífico0,89720
    Horno0,79150
    Ordenador0,01180
    CompañíaPrecio kWh
    Endesa0,01 euro/kWh

     

El simulador de inversión permite calcular el importe de los intereses devengados para un determinado capital de inversión inicial. Para ello, el usuario introduce una cantidad y deberá pulsar uno de los botones de las dos opciones de inversión que la interfaz gráfica le muestra (inversión 3% TAE o inversión 4% TAE). La aplicación le mostrará los intereses devengados para la inversión escogida.

Simulacion_inversion

NOTA: La aplicación debe usar la siguiente fórmula para calcular los intereses:

Intereses brutos devengados = (C * i * d) / 36500

Donde:

  1. Enumere las clases del Framework Swing que necesita para el diseño de la interfaz gráfica de la aplicación.

    ControlesEventos
    - JFrame
    - JLabel
    - JTextField
    - JButton
    - ActionEvent: para representar una acción del usuario en la interfaz.
    - ActionListener: se usa para detectar y manejar eventos de acción.

     

  2. ¿Qué es necesario para gestionar los eventos de esta interfaz gráfica? Enumere las decisiones de diseño e implementación que debe tomar.

    Añadiré los controladores de eventos ActionEvent para representar una acción del usuario en la interfaz y ActionListener para detectar y manejar eventos de acción.

     

  3. Implemente la aplicación en Java.

    Modelo simple, botones autocolocados

     

    Colocando botones en posición deseada:

 

La siguiente aplicación permite consultar primas de una serie de aseguradoras. Cada vez que el usuario selecciona una aseguradora, la ventana principal de la aplicación mostrará el coste de la prima de su seguro en función de sus dos tipos de seguros: tipo Básico y Todo Riesgo.

Simulacion_primas

NOTA: considere lo siguiente de cara a la resolución del ejercicio:

  1. Enumere las clases del framework Swing que necesita para implementar la aplicación.

    ControlesEventos
    - JFrame
    - JLabel
    - JTextField
    - JComboBox
    - ActionEvent: para representar una acción del usuario en la interfaz.
    - ActionListener: se usa para detectar y manejar eventos de acción.

     

  2. ¿Qué es necesario para gestionar los eventos de esta interfaz? Enumere las decisiones de diseño necesarias para ello.

    Añadiré los controladores de eventos ActionEvent para representar una acción del usuario en la interfaz y ActionListener para detectar y manejar eventos de acción.

     

  3. Implemente la aplicación en Java.

    Modelo simple, botones autocolocados

     

Colocando botones en posición deseada:

 

Dado el siguiente modelo de clases en UML

images/Gestion_intervenciones

  1. Implemente en Java el modelo de clases junto con sus constructores y métodos.

     

    1. Codifique una clase denominada TestIntervenciones que pruebe la funcionalidad del modelo creando una serie de intervenciones e imprimiendo por pantalla el tiempo medio y el número de intervenciones cerradas. Para ello, considere el siguiente ejemplo de valores de una intervención:

      Idfecha_ifecha_fintResolucionEstadoTécnicosZona
      I00111/4/202012/4/2020501T001, electricidad
      T002, fontaneria
      Auditorio
      I00211/5/202011/5/2020300T001, electricidadHall